iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

Json處理

今天要講的是如何使用linux的jq命令處理json內容。
可能有人會問明明一堆程式語言與圖形介面工具可以做到同樣的事,為什麼硬要使用cli指令來處理JSON

  1. ,why not
  2. 很多時候從curl獲得的JSON資料都未經排版而難以閱讀
  3. 使用CLI命令可能會更加方便和高效
  4. 最重要的是由於cli命令靈活性高且可被輕易地被包含在腳本中,因此可以加入到自動化處理的流程
    不過jq只在某些distro中內建,也就是說需自行手動安裝,以Ubuntu來說,可以用sudo apt install jq來安裝

介紹

jq是一個輕量級的命令行工具,可以用來處理JSON格式的數據

  • 可以對JSON數據進行過濾、轉換、排序、分組等操作,並支持多種輸出格式,如純文本、彩色文本、HTML等。
  • 語法類似於JavaScript的對象表示法,可以使用點運算符、方括號、管道符等來構造查詢表達式。
  • 可以從標準輸入或文件中讀取JSON數據,也可以從URL中獲取JSON數據,並將處理後的結果輸出到標準輸出或文件中。

實際使用

  • 使用'.<key[nth]>'獲取JSON中的第<nth>個相對應key的值
    • 若使用.key[]則是獲取所有相對應key的值
    • 可用.key[a,b,c,d,...]指定多個index或使用.key[start:end]指定index範圍
    • 可指定以逗號分隔的字串或將所有需要的key用方括號包起以獲取多個key
    $ jq '.' file
    
    ## 也等價於"以jq將json格式化輸出"
    $ cat file | jq
    
    1. 獲取某個巢狀json中的key中的值
    $ cat file| jq '.nested.key[nth]'
    ## 也可以使用方括號指定key
    $ cat file| jq '.["nested"]["key"]'
    
  • 修改JSON中某個key的值
$ cat file | jq '.key = value'
  • 設定變數
    語法: jq --arg name value
    指定一個jq變數$name為value
    • 若要指定value為檔案時可用--rawfile或將value指定為"$(<file)"
    • 指定$name為一個json時則使用--argjson
## 將json[amogus]的值設為sus
cat file| jq --arg amogus sus '.amogus=$amogus'

## 將json[nested]的值設為另一個json檔案
cat file | jq --argjson nested "$(< anotherJson)" '.nested=$value'
## 注意: "$(<anotherJson)"本身是shell指令
## 其將anotherfile的內容讀入stdin後再傳給jq進行處理

## 將json[anotherFile]的值設為anotherFile的內容

jq的基本使用就先介紹到這邊,有興趣的可以參考以下連結或jq的官網

REF

jq 實戰教學 - MyApollo
[Linux] jq 指令:好用又輕量的 JSON 工具 – OneJar 的隧道
jq使用外部文件作为--arg参数值 - 简书


上一篇
Day11:文字處理
下一篇
Day13: Vim介紹
系列文
I Use Linux BTW: 談Linux與其指令30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言